Multiple Constructors এর মধ্যে JSON Mapping গাইড ও নোট

Java Technologies - জ্যাকসন অ্যানোটেশন (Jackson Annotations) - @JsonCreator এবং @JsonValue
335

Jackson JSON থেকে Java Object তৈরি করার সময় Multiple Constructors থাকলে কোন কনস্ট্রাক্টর ব্যবহার করা হবে তা Jackson Annotations দিয়ে নির্ধারণ করা যায়।


1. Default Behavior

Jackson ডিফল্টভাবে নো-আর্গ কনস্ট্রাক্টর (No-Args Constructor) ব্যবহার করে। যদি নো-আর্গ কনস্ট্রাক্টর না থাকে, তবে এটি ব্যর্থ হবে।

Example Without Annotations:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
            "id": 101,
            "name": "John Doe",
            "email": "john.doe@example.com"
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);

        System.out.println("User Name: " + user.name);
    }
}

class User {
    public int id;
    public String name;
    public String email;

    // Constructor 1
    public User() {} // Default constructor

    // Constructor 2
    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}

আউটপুট:

User Name: John Doe

2. Multiple Constructors Handling

যদি একাধিক কনস্ট্রাক্টর থাকে, তখন Jackson বুঝবে না কোনটি ব্যবহার করতে হবে। এটি সমাধান করতে @JsonCreator এবং @JsonProperty ব্যবহার করা হয়।


3. @JsonCreator দিয়ে Constructor নির্বাচন

@JsonCreator অ্যানোটেশন একটি নির্দিষ্ট কনস্ট্রাক্টরকে JSON ডেসিরিয়ালাইজেশনের জন্য নির্বাচন করে।

Example with @JsonCreator:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

class User {
    public int id;
    public String name;
    public String email;

    // Constructor 1 (Default)
    public User() {}

    // Constructor 2 (Selected for JSON Mapping)
    @JsonCreator
    public User(@JsonProperty("id") int id, 
                @JsonProperty("name") String name, 
                @JsonProperty("email") String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}

Deserialization Example:

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
            "id": 101,
            "name": "John Doe",
            "email": "john.doe@example.com"
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);

        System.out.println("User Name: " + user.name);
    }
}

আউটপুট:

User Name: John Doe

4. Complex Example: Multiple Constructors

মডেল ক্লাস:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

class Product {
    public int id;
    public String name;
    public double price;

    // Default Constructor
    public Product() {}

    // Constructor 1
    @JsonCreator
    public Product(@JsonProperty("id") int id, 
                   @JsonProperty("name") String name) {
        this.id = id;
        this.name = name;
    }

    // Constructor 2
    public Product(int id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
}

Deserialization Example:

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
            "id": 101,
            "name": "Laptop"
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        Product product = objectMapper.readValue(json, Product.class);

        System.out.println("Product Name: " + product.name);
        System.out.println("Product Price: " + product.price); // Will remain 0.0
    }
}

আউটপুট:

Product Name: Laptop
Product Price: 0.0

5. @JsonProperty দিয়ে Field Mapping নিশ্চিত করা

@JsonProperty ব্যবহার করে JSON ফিল্ড এবং কনস্ট্রাক্টরের প্যারামিটারগুলোর মধ্যে সুনির্দিষ্ট ম্যাপিং নিশ্চিত করা হয়।

Example:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

class Employee {
    public int employeeId;
    public String employeeName;

    @JsonCreator
    public Employee(@JsonProperty("id") int employeeId, 
                    @JsonProperty("name") String employeeName) {
        this.employeeId = employeeId;
        this.employeeName = employeeName;
    }
}

Deserialization Example:

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
            "id": 201,
            "name": "Alice"
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        Employee employee = objectMapper.readValue(json, Employee.class);

        System.out.println("Employee ID: " + employee.employeeId);
        System.out.println("Employee Name: " + employee.employeeName);
    }
}

আউটপুট:

Employee ID: 201
Employee Name: Alice

6. Lombok এবং Jackson একসাথে ব্যবহার

যদি আপনি Lombok ব্যবহার করেন, তাহলে @AllArgsConstructor বা @RequiredArgsConstructor এর সঙ্গে Jackson এর অ্যানোটেশন ব্যবহার করতে পারেন।

Example with Lombok:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
public class Department {
    @JsonProperty("id")
    private int id;

    @JsonProperty("name")
    private String name;
}

Deserialization Example:

public class Main {
    public static void main(String[] args) throws Exception {
        String json = """
        {
            "id": 501,
            "name": "HR"
        }
        """;

        ObjectMapper objectMapper = new ObjectMapper();
        Department department = objectMapper.readValue(json, Department.class);

        System.out.println("Department ID: " + department.getId());
        System.out.println("Department Name: " + department.getName());
    }
}

আউটপুট:

Department ID: 501
Department Name: HR

Key Points

  1. Multiple Constructors হ্যান্ডল করা:
    • @JsonCreator ব্যবহার করে নির্দিষ্ট Constructor নির্বাচন করুন।
    • @JsonProperty ব্যবহার করে JSON ফিল্ড এবং Constructor প্যারামিটার ম্যাপিং নিশ্চিত করুন।
  2. Default Constructor প্রয়োজনীয়:
    • Jackson ডিফল্টভাবে নো-আর্গ কনস্ট্রাক্টর ব্যবহার করে, এটি না থাকলে @JsonCreator দিয়ে নির্দেশ করতে হবে।
  3. Lombok Integration:
    • Lombok এবং Jackson একত্রে ব্যবহার করা হলে কনস্ট্রাক্টর অ্যানোটেশন সঠিকভাবে প্রয়োগ করুন।

এই পদ্ধতিগুলো অনুসরণ করে আপনি Jackson-এ Multiple Constructors সহ JSON Mapping সফলভাবে হ্যান্ডল করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...